import pymysql
import pandas as pd
from mysql import get_connection


def download_fund_data_to_csv(
    nav_date='2025-11-14',
    output_file=None,
    host='localhost',
    port=3306,
    user='root',
    password='Aa123456.',
    database='fund_data'
):
    """
    从数据库获取指定日期的基金数据并保存到本地CSV文件，列名转换为中文
    
    Args:
        nav_date: 净值日期，格式：'YYYY-MM-DD'
        output_file: 输出文件路径，如果为None则自动生成文件名
        host: 数据库主机地址
        port: 数据库端口
        user: 用户名
        password: 密码
        database: 数据库名
        
    Returns:
        bool: 保存成功返回True，失败返回False
    """
    
    # 定义数据库字段名到中文列名的映射
    column_mapping = {
        'id': '主键ID',
        'fund_code': '基金代码',
        'fund_name': '基金简称',
        'nav_date': '净值日期',
        'unit_nav': '单位净值',
        'accumulated_nav': '累计净值',
        'nav_abnormal': '净值异常',
        
        'return_1w': '持有1周收益率(%)',
        'max_drawdown_1w': '持有1周最大回撤(%)',
        'profit_prob_1w': '持有1周盈利概率',
        'return_mean_1w': '持有1周收益率均值',
        'return_std_1w': '持有1周收益率标准差',
        'drawdown_mean_1w': '持有1周最大回撤均值',
        'drawdown_std_1w': '持有1周最大回撤标准差',
        
        'return_1m': '持有1月收益率(%)',
        'max_drawdown_1m': '持有1月最大回撤(%)',
        'profit_prob_1m': '持有1月盈利概率',
        'return_mean_1m': '持有1月收益率均值',
        'return_std_1m': '持有1月收益率标准差',
        'drawdown_mean_1m': '持有1月最大回撤均值',
        'drawdown_std_1m': '持有1月最大回撤标准差',
        
        'return_3m': '持有3月收益率(%)',
        'max_drawdown_3m': '持有3月最大回撤(%)',
        'profit_prob_3m': '持有3月盈利概率',
        'return_mean_3m': '持有3月收益率均值',
        'return_std_3m': '持有3月收益率标准差',
        'drawdown_mean_3m': '持有3月最大回撤均值',
        'drawdown_std_3m': '持有3月最大回撤标准差',
        
        'return_6m': '持有半年收益率(%)',
        'max_drawdown_6m': '持有半年最大回撤(%)',
        'profit_prob_6m': '持有半年盈利概率',
        'return_mean_6m': '持有半年收益率均值',
        'return_std_6m': '持有半年收益率标准差',
        'drawdown_mean_6m': '持有半年最大回撤均值',
        'drawdown_std_6m': '持有半年最大回撤标准差',
        
        'return_1y': '持有1年收益率(%)',
        'max_drawdown_1y': '持有1年最大回撤(%)',
        'profit_prob_1y': '持有1年盈利概率',
        'return_mean_1y': '持有1年收益率均值',
        'return_std_1y': '持有1年收益率标准差',
        'drawdown_mean_1y': '持有1年最大回撤均值',
        'drawdown_std_1y': '持有1年最大回撤标准差',
        
        'return_2y': '持有2年收益率(%)',
        'max_drawdown_2y': '持有2年最大回撤(%)',
        'profit_prob_2y': '持有2年盈利概率',
        'return_mean_2y': '持有2年收益率均值',
        'return_std_2y': '持有2年收益率标准差',
        'drawdown_mean_2y': '持有2年最大回撤均值',
        'drawdown_std_2y': '持有2年最大回撤标准差',
        
        'return_3y': '持有3年收益率(%)',
        'max_drawdown_3y': '持有3年最大回撤(%)',
        'profit_prob_3y': '持有3年盈利概率',
        'return_mean_3y': '持有3年收益率均值',
        'return_std_3y': '持有3年收益率标准差',
        'drawdown_mean_3y': '持有3年最大回撤均值',
        'drawdown_std_3y': '持有3年最大回撤标准差',
        
        'created_at': '创建时间',
        'updated_at': '更新时间'
    }
    
    connection = None
    try:
        # 创建数据库连接
        print(f"正在连接数据库 {database}...")
        connection = get_connection(
            host=host,
            port=port,
            user=user,
            password=password,
            database=database
        )
        print("✓ 数据库连接成功")
        
        # 构建SQL查询语句
        sql = f"SELECT * FROM fund_data WHERE nav_date = '{nav_date}'"
        print(f"执行查询: {sql}")
        
        # 使用pandas读取数据
        df = pd.read_sql(sql, connection)
        
        # 检查是否有数据
        if df.empty:
            print(f"⚠ 警告: 未找到日期为 {nav_date} 的数据")
            return False
        
        print(f"✓ 成功获取 {len(df)} 条数据")
        
        # 将列名转换为中文
        df.rename(columns=column_mapping, inplace=True)
        print("✓ 列名已转换为中文")
        
        # 生成输出文件名
        if output_file is None:
            output_file = f"fund_data_{nav_date}.csv"
        
        # 保存到CSV文件
        df.to_csv(output_file, index=False, encoding='utf-8-sig')
        print(f"✓ 数据已保存到: {output_file}")
        
        # 显示数据预览
        print("\n数据预览（前5行）:")
        print(df.head())
        print(f"\n数据形状: {df.shape[0]} 行 × {df.shape[1]} 列")
        
        return True
        
    except pymysql.Error as e:
        print(f"✗ 数据库错误: {e}")
        return False
        
    except Exception as e:
        print(f"✗ 发生错误: {e}")
        return False
        
    finally:
        if connection:
            connection.close()
            print("✓ 数据库连接已关闭")


# 使用示例
if __name__ == "__main__":
    # 下载指定日期的基金数据
    download_fund_data_to_csv(
        nav_date='2025-11-14',
        output_file='fund_data_2025-11-14.csv'
    )
